package com.xqb.common.utils;


import com.xqb.modules.domain.dto.EmailMessageDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

/**
 * @author jinch
 * @Description 邮件发送工具类
 * @date 2021/12/16 17:16
 */
@Slf4j
@Component
public class MailUtils {
    @Value("${mail.sender.email}")
    private String senderEmail;

    @Value("${mail.sender.password}")
    private String senderPassword;

    @Value("${mail.smtp.host}")
    private String smtpHost;

    @Value("${mail.smtp.port}")
    private String smtpPort;

    @Value("${mail.smtp.auth}")
    private String smtpAuth;

    @Value("${mail.smtp.ssl}")
    private String smtpSslEnable;

    @Value("${mail.debug}")
    private String debug;

    public void sendEmail(EmailMessageDto emd) throws MessagingException, UnsupportedEncodingException {
        // 邮件服务器配置
        Properties properties = getProperties();

        // 创建邮件会话
        // Session.getInstance()方法需要两个参数，第一个是Properties对象，第二个是Authenticator对象
        Session session = Session.getInstance(properties, new Authenticator() {
            // 重写getPasswordAuthentication方法，用于获取发送邮件时所需的用户名和密码
            protected PasswordAuthentication getPasswordAuthentication() {
                // 返回包含用户名和密码的PasswordAuthentication对象
                return new PasswordAuthentication(senderEmail, senderPassword);
            }
        });

        // 创建邮件消息
        // MimeMessage对象用于创建邮件消息
        Message message = new MimeMessage(session);
        // 设置发件人地址
        message.setFrom(new InternetAddress(senderEmail, emd.getName(), "UTF-8"));
        // 设置收件人地址
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(emd.getToEmail()));
        // 设置邮件主题
        message.setSubject(emd.getSubject());
        // 设置邮件正文内容
        message.setText(emd.getContent());

        // 发送邮件
        Transport.send(message);
        // 记录日志，表示邮件发送成功
        log.info("邮件发送成功！");
    }

    private Properties getProperties() {
        Properties properties = new Properties();
        // 设置邮件传输协议为smtp
        properties.put("mail.transport.protocol", "smtp");
        // 设置邮件服务器的地址
        properties.put("mail.smtp.host", smtpHost);
        // 设置邮件服务器的端口
        properties.put("mail.smtp.port", smtpPort);
        // 设置是否需要进行身份验证
        properties.put("mail.smtp.auth", smtpAuth);
        // 设置是否启用SSL加密
        properties.put("mail.smtp.ssl.enable", smtpSslEnable);
        // 设置是否开启调试模式
        properties.put("mail.debug", debug);
        return properties;
    }
}


